<?php
namespace app\job;

use app\common\model\UserRedpacket;
use think\Config;
use think\Db;
use think\Exception;
use think\Log;
use think\queue\Job;

/**
 * 未中奖红包
 * Class RedPacket
 * @package app\job
 */
class RedPacket{

    public function fire(Job $job, $data){

        //....这里执行具体的任务
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->doHelloJob($data);

        if ($isJobDone) {
            // 如果任务执行成功， 记得删除任务
            $job->delete();
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                $job->delete();

            }
        }


    }

    public function failed($data){

        // ...任务达到最大重试次数后，失败了
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkToBeDone($data){
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理...
     */
    private function doHelloJob($data)
    {
        //TODO 方案一
        //获取未中奖记录 user
        //获取中奖记录 user
        //计算差集
        //生成系统红包
        //给用户生成红包记录
        //$userRedpacket = new UserRedpacket();

        //TODO 方案二
        //生成系统红包
        //用户接口判断是否有领取资格

        $redPacketModel = new \app\common\model\Redpacket();

        $redPacket = [
            'uuid'          => get_sn(10),
            'category'      => 1, //未中奖红包
            'type'          => 1,  //1=固定 2=随机金额
            'send_time'     => $data['send_time'], //发包时间
            'amount'        => 0,  //红包总金额
            'unit_amount'  => 10,  //单个红包金额
            'total'         => 0,  //红包个数
            'stock'         => 0,  //剩余个数 预留
        ];
        //红包过期时间
        $expire_redpacket = $data['expire_redpacket'];
        if ($expire_redpacket){
            $expiretime = $data['send_time'] + ($expire_redpacket * 60 * 60);
            $redPacket['expiretime'] = $expiretime;
        }


        try {
            $redPacketModel->save($redPacket);
            $msg = '创建红包成功！';
            LOG::myLog($msg,$redPacket,'job');
        }catch (Exception $e){
            $msg = $e->getMessage();
            //job日志
            LOG::myLog($msg,$redPacket,'job');
        }

        return true;
    }

}